/*
函数执行形成一个私有作用域(A)
，A的上级作用域是谁，和它在哪执行没有关系
，主要是看他在哪定义的，在哪个作用域下定义的，当前A的上级作用域就是谁。
*/

/*var n = 10;
function sum(){
    console.log(n);
}
// sum(); //=>10

~function(){
    var n = 100;
    sum(); //=>10 //sum的宿主环境（和箭头函数的宿主环境定义貌似不一样）是当前自执行函数形成的私有作用域，宿主环境和上级作用域没有关系
}();*/


/*
下面栗子，在堆内存中存obj的时候，遇到fn，发现是一个函数自执行，于是开始函数自执行，开辟一个栈内存，形参赋值，变量提升，逐行执行，然后return function，因为是function，此时会另外再开辟一个堆内存，返回堆内存的地址，作为return 返回的值。
*/
/*
var n = 10;
var obj = {
    n:20
    ,fn:
    //赋值 赋值 必须是一个值被复
    //堆内存保存的是 键 值 对
    (function(){
        //->上级作用域:全局作用域
        var n = 30;
        //↓不会提升 因为只会对等号左边进行提升 况且这个还没有名字
        return function(){
            //->上级作用域：自执行函数
            console.log(n);
        }
    })()
};

obj.fn();*/


var n = 10;
var obj = {
    n:20
    ,fn:
    //赋值 赋值 必须是一个值被复
    //堆内存保存的是 键 值 对
        (function(n){
            //->上级作用域:全局作用域
            var n = 30;
            //↓不会提升 因为只会对等号左边进行提升 况且这个还没有名字
            return function(){
                //->上级作用域：自执行函数
                console.log(n);
            }
        })(obj.n) //报错 TypeError: Cannot read property 'n' of undefined //此时该堆内存还没有保存完键值对，地址还没有赋给obj，我们是无法通过obj.n访问到的 obj此时的值是undefined
};

obj.fn();